#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 10

typedef struct 
{
   int data[MAXSIZE];//用于存储栈中元素的数组
   int top;//栈顶指针
}SqStack;

//初始化栈
void InitStack(SqStack *s);
//判断栈空
int StackEmpty(SqStack *s);
//判断栈满
int StackFull(SqStack *s);
//入栈
int push_stack(SqStack *s, int value);
//出栈
int pop_stack(SqStack *s,int *value);
//获取栈顶元素
int getTopdata(SqStack *s,int *value);


int main(int argc, char const *argv[])
{
    SqStack stack;
    //初始化栈
    InitStack(&stack);

    //入栈   成功:0  失败:1
    if(!push_stack(&stack,1));else printf("stacl is full\n");
    if(!push_stack(&stack,2));else printf("stacl is full\n");
    if(!push_stack(&stack,3));else printf("stacl is full\n");

    //获取栈顶元素   成功:0  不成功:1
    int dat=0;  
    if(!getTopdata(&stack,&dat))
    {
        printf("栈顶元素:%d\n",dat);
    }
    
    //出栈    成功:0  不成功:1
    if(!pop_stack(&stack,&dat))
    printf("出栈元素为:%d\n",dat);
    if(!pop_stack(&stack,&dat))
    printf("出栈元素为:%d\n",dat);
    if(!pop_stack(&stack,&dat))
    printf("出栈元素为:%d\n",dat);
    return 0;
}


//初始化栈
void InitStack(SqStack *s)
{
    s->top=-1;  //初始化栈为空，栈顶指针指向-1
}
//判断栈空   空:1   非空:0
int StackEmpty(SqStack *s)
{
    if(s->top==-1)
    {
        return 1;
    }
    return 0;
}
//判断栈满   满:1   非满:0
int StackFull(SqStack *s)
{
    return s->top==MAXSIZE-1;
}
//入栈   成功:0  不成功:1
int push_stack(SqStack *s,int value)
{
    //判满
    if(StackFull(s))
    {
        printf("stack is full\n");
        return 1;
    }
    s->data[++s->top]=value;
    return 0;
}
//出栈   成功:0  不成功:1
int pop_stack(SqStack *s,int *value)
{
    //判空
    if(StackEmpty(s))
    {
        printf("stack is empty\n");
        return 1;
    }
    *value=s->data[s->top];
    s->top--;
    return 0;
}
//获取栈顶元素   成功:0  不成功:1
int getTopdata(SqStack *s,int *value)
{
    if(StackEmpty(s))
    {
        printf("stack is empty\n");
        return 1;
    }
    *value=s->data[s->top];
    return 0;
}